import { useDiscMessage } from '@/hooks/useDiscMessage'
import { useToken } from '@/hooks'
import { IResult } from '@/types/response'
import { useDebounceFn } from '@vueuse/core'
import axios, { AxiosError, AxiosRequestHeaders, AxiosResponse } from 'axios'
import { useRouter } from 'vue-router'
import { ElMessage } from 'element-plus'

// 创建一个 axios 实例
const { message } = useDiscMessage()

let errMsg: string = ''

// 防抖显示token失效信息
const debounceDisplayMsg = useDebounceFn(() => {
    message.error(errMsg)
})

const httpRequest = axios.create({
    baseURL: '/', // 所有的请求地址前缀部分
    timeout: 60000 * 5, // 请求超时时间毫秒
    withCredentials: true, // 异步请求携带cookie
    headers: {
        // 设置后端需要的传参类型
        'Content-Type': 'application/json',
        'X-Requested-With': 'XMLHttpRequest',
    },
})

// 添加请求拦截器
httpRequest.interceptors.request.use(
    function (config) {
        // 在发送请求之前做些什么


        if (config.url?.indexOf("geoserver") != -1) {
          config.baseURL = ''
        }else{
          config.baseURL = '/'

        }
        

        const headers: AxiosRequestHeaders = config.headers ?? {}
        // const { getToken } = useToken
        // // 如果没有headers config 则默认合并
        // headers.Authorization = getToken() as string
        // config.headers = headers

        console.log('config======>', config)

        return config
    },
    function (error) {
        // 对请求错误做些什么
        return Promise.reject(error)
    },
)

// 添加响应拦截器
httpRequest.interceptors.response.use(
    function (response) {
        // todo: 需要优化refreshtoken 防抖机制
        const res = response.data as IResult
        //note: 这个地方暂时先不开放 省的跳转出问题

        // 清空错误提醒
        errMsg = ''
        if (res.code == 401) {
            // NOTE:如果没有发出提示，则进入显示一次提示，别的请求token失效时，就不在显示提示信息了
            errMsg = res.message
            // debounceDisplayMsg()

            useRouter().push('/login')
        }

        return res
    },
    function (error: AxiosError<any, any>) {

        if (error.response?.status == 500) {
            ElMessage.error('接口错误,请重新尝试')
        }

        return Promise.reject({
            code: -1,
            message: '接口错误,请重新尝试',
            data: '',
        } as IResult)
    },
)

export { httpRequest }
